let callbacks = []; //事件队列,包含异步dom更新队列和用户添加的异步事件
let pending = false; //控制变量，每次宏任务期间执行一次flushCallbacks清空callbacks
funciton nextTick(cb) {
	callbacks.push(cb);
	if (!pending) {
		pending = true;
		//这里也可以使用Promise，Promise创建的是微任务，微任务会在本次事件循环同步代码执行结束后执行，
		//使用setTimeout创建的是宏任务，同样会在此次同步代码执行完成后执行，区别是在setTimeout代码执行之前会穿插一次无效的视图渲染，因此我们尽量使用Promise创建微任务实现异步更新。
		if (Promise) {
			Promise.resovle().then(() => {
				flushCallbacks();
			})
		} else {
			setTimeout(() => {
				flushCallbacks();
			})
		}
	}
}

function flushCallbacks() {
	pending = false; //状态重置
	callbacks.forEach(cb => {
		callbacks.shift()();
	})
}